From 23599a7fd9d1856f06832be4852738699991ca47 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Fri, 13 Mar 2009 07:43:45 +0000 Subject: [PATCH] [SVM] fix segment descriptors to allow migration to Intel VT systems Signed-off-by: Christoph Egger --- xen/arch/x86/hvm/svm/svm.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index 8b49ae8ff4..bd320fbe1f 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -488,28 +488,40 @@ static void svm_get_segment_register(struct vcpu *v, enum x86_segment seg, { case x86_seg_cs: memcpy(reg, &vmcb->cs, sizeof(*reg)); + reg->attr.fields.g = reg->limit > 0xFFFFF; break; case x86_seg_ds: memcpy(reg, &vmcb->ds, sizeof(*reg)); + if ( reg->attr.fields.type != 0 ) + reg->attr.fields.type |= 0x1; break; case x86_seg_es: memcpy(reg, &vmcb->es, sizeof(*reg)); + if ( reg->attr.fields.type != 0 ) + reg->attr.fields.type |= 0x1; break; case x86_seg_fs: svm_sync_vmcb(v); memcpy(reg, &vmcb->fs, sizeof(*reg)); + if ( reg->attr.fields.type != 0 ) + reg->attr.fields.type |= 0x1; break; case x86_seg_gs: svm_sync_vmcb(v); memcpy(reg, &vmcb->gs, sizeof(*reg)); + if ( reg->attr.fields.type != 0 ) + reg->attr.fields.type |= 0x1; break; case x86_seg_ss: memcpy(reg, &vmcb->ss, sizeof(*reg)); reg->attr.fields.dpl = vmcb->cpl; + if ( reg->attr.fields.type == 0 ) + reg->attr.fields.db = 0; break; case x86_seg_tr: svm_sync_vmcb(v); memcpy(reg, &vmcb->tr, sizeof(*reg)); + reg->attr.fields.type |= 0x2; break; case x86_seg_gdtr: memcpy(reg, &vmcb->gdtr, sizeof(*reg)); -- 2.30.2